home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD-Sensation: Golden Games / Amiga CD-Sensation - Ausgabe 2 - Golden Games (1996)(GTI - Schatztruhe)(DE)[!].iso / Board & Card / Backgammon / RNG.asm < prev   
Assembly Source File  |  1995-07-01  |  5KB  |  136 lines

  1. ; June 19, 1995
  2. ; This program is a pair of subroutines I use to generate random
  3. ; number is assembly langauge.  The first subroutine is called at
  4. ; the start of the program to initialize the seeds to unique values.
  5. ; This is done using the currenttime function of intuition.  Thus,
  6. ; S2 which is set to the microseconds value has a 1 in 1,000,000
  7. ; chance of starting at the same value as any given previous run.
  8. ; S1 should always be unique.
  9. ; The second subroutine is based on the algorithm of Pierre L'Ecuyer
  10. ; [L'Ecuyer, P. Efficient and Portable Combined Random Number Generators.
  11. ; _Commun._ASM_31_, 6 (June, 1988) 742].  Please see the original
  12. ; article for a detailed explanation.
  13. ;
  14. ; These programs were written to be used by any 68000 type processor
  15. ; and can be assembled using the a68k assembler.  They can be incorp-
  16. ; orated into programs directly or by linking the object code if
  17. ; setseed, randnum, intubase, and mathbase are xdef'ed in this routine
  18. ; and xref'ed in the main program.
  19. ; Distribution:  These routines are intended as freeware and their
  20. ; distribution is restricted as follows:
  21. ;
  22. ; Source code:  The source code must be accompanied by all comments
  23. ;        include the introductory comments and the program comments.
  24. ;        No fee may be charged for distribution of the code.
  25. ; Executable code:  The executable version of these routines may be used if:
  26. ;        1) The documentation of the main program includes the
  27. ;           following text:
  28. ;           "This program uses the L'Ecuyer random number generator
  29. ;            as written for the amiga by Scott McMahan."
  30. ;        2) The main program using these routines is either freeware
  31. ;           or the author(s) have the express, written consent of me,
  32. ;           Scott McMahan.
  33. ;           (No big deal here, I just don't want to pay for shareware
  34. ;           that uses my routine.  Permission will be easy to get.)
  35. ;
  36. ;To contact the author and/or make bug reports, mail me at
  37. ;       Scott McMahan
  38. ;       2538 Fairfield Pl #1
  39. ;       Madison, WI 53704
  40. ; Sorry, no Email because I expect my email address to be changing in
  41. ; the next 6 months and then again in the next 2 years.
  42.  
  43. CurrentTime    equ    -$0054
  44. IEEEDPFlt    equ    -$0024
  45. IEEEDPDiv    equ    -$0054
  46.  
  47.     ;Routine to set up S1 and S2 (seeds for random number generator)
  48.     ;based on currenttime function
  49.     ;parameters:            none
  50.     ;presets:            intubase=    base address of
  51.     ;                        intuition.library
  52.     ;                CurrentTime=    offset for currenttime
  53.     ;                        function of intuition
  54.     ;returns:                none
  55.     ;changed regs/mem locations:    none/S1,S2
  56.     section text,code
  57.     xdef    @setseed
  58. @setseed:
  59. ;    movem.l A0/A1,-(A7)        ;save registers    ******
  60.     lea    S1(A4),A0        ;get the current seconds and
  61.     lea    S2(A4),A1        ;microseconds as seeds
  62.     move.l    _IntuitionBase(A4),A6
  63.     jsr    CurrentTime(A6)        ;in S1 and S2
  64.     addq.l    #1,S1(A4)        ;add one to S1 and S2 to make sure greater than 0
  65.     addq.l    #1,S2(A4)
  66.     cmpi.l    #$7FFFFFAA,S1(A4)    ;make sure S1<=2147483562
  67.     ble.S    20$
  68.     subi.l    #$7FFFFFAA,S1(A4)
  69. 20$    cmpi.l    #$7FFFFF06,S2(A4)    ;make sure S2<=2147483398
  70.     ble.S    30$
  71.     subi.l    #$7FFFFF06,S2(A4)
  72. 30$ ;    movem.l (A7)+,A0/A1        ******
  73.     rts
  74.  
  75.     ;Routine to generate a random number from 0 to 1
  76.     ;using S1 and S2 as seeds
  77.     ;Parameters:            S1 and S2    Seeds
  78.     ;presets            mathbase =    base address of
  79.     ;                        mathieeedoubbas.library
  80.     ;                IEEEDPFlt=    Offset of int to IEEE
  81.     ;                        routine
  82.     ;                IEEEDPDiv=    Offset of IEEE division
  83.     ;                        routine
  84.     ;Returns:            D0/D1 =    Random number from 0 to 1
  85.     ;                    in IEEE double precision
  86.     ;Changed regs/mem locations    D0,D1/S1,S2
  87.  
  88.     xdef    @random
  89. ;    section rand,code        ******
  90. @random    movem.l D2/D3/A6,-(A7)
  91.     move.l    S1(A4),D1
  92.     divu    #$D1A4,D1        ;D1=S1 DIV 53668 (k in article)
  93.     move.l    D1,D0            ;D0 also equals k
  94.     swap    D1
  95.     mulu    #$9C4E,D1        ;D1=40014*(S1-k*53668)
  96.     mulu    #$2FB3,D0        ;D0=12211*k
  97.     sub.l    D0,D1            ;D1=40014*(S1-k*53668)-12211*k
  98. ;    tst.l    D1            ******
  99.     bgt.S    20$        ;if D1<1
  100.     add.l    #$7FFFFFAB,D1        ;then D1=D1+2147483563
  101. 20$    move.l    D1,S1(A4)        ;store D2 in S1 as new seed
  102.     move.l    S2(A4),D1
  103.     divu    #$CE26,D1        ;D1=S2 DIV 52774 (k in article)
  104.     move.l    D1,D0            ;D0 also equals k
  105.     swap    D1
  106.     mulu    #$9EF4,D1        ;D1=40692*(S1-k*52774)
  107.     mulu    #$0ECF,D0        ;D0=3791*k
  108.     sub.l    D0,D1            ;D1=40692*(S1-k*52774)-3791*k
  109. ;    tst.l    D1
  110.     bgt.S    30$        ;if D1<1
  111.     add.l    #$7FFFFF07,D1        ;then D1=D1+2147483399
  112. 30$    move.l    D1,S2(A4)        ;store D2 in S2 as new seed
  113.     move.l    S1(A4),D0
  114.     sub.l    S2(A4),D0        ;D0=S1-S2
  115. ;    tst.l    D0            ******
  116.     bge.S    40$        ;if D0<0
  117.     add.l    #$7FFFFFA9,D0        ;then D0=D0+2147483562
  118. 40$    move.l    _MathIeeeDoubBasBase(A4),A6
  119.     jsr    IEEEDPFlt(A6)        ;convert it to IEEE Double Precision
  120.     move.l    #$41DFFFFF,D2        ;
  121.     move.l    #$EA800000,D3        ;
  122.     jsr    IEEEDPDiv(A6)        ;Divide it by 2147483562
  123.     movem.l (A7)+,D2/D3/A6
  124.     rts
  125.  
  126.     section __MERGED,BSS
  127. ;    even                ******
  128.     xref    _IntuitionBase
  129.     xref    _MathIeeeDoubBasBase
  130.  
  131. S1:    ds.l    1            ;first seed for generator, set to seconds by
  132.                     ;currenttime
  133. S2:    ds.l    1            ;second seed for generator, set to microsecs
  134.                     ;by currenttime
  135.     end
  136.